package collection

import (
	"sort"
	"strings"
)

// 此方法类似于_.sortBy，除了它允许指定 iteratee（迭代函数）结果如何排序。
// 如果没指定 orders（排序），所有值以升序排序。 否则，指定为"desc" 降序，或者指定为 "asc" 升序，排序对应值。
func OrderBy(array []T, iteratee func(value T) V, orders ...string) []T {
	var asc = true
	if len(orders) > 0 && strings.ToLower(orders[0]) == "desc" {
		asc = false
	}
	var valueArr []V
	for _, value := range array {
		valueArr = append(valueArr, value)
	}
	if asc {
		sort.SliceStable(valueArr, func(i, j int) bool {
			return iteratee(valueArr[i]) < iteratee(valueArr[j])
		})
	} else {
		sort.SliceStable(valueArr, func(i, j int) bool {
			return iteratee(valueArr[i]) > iteratee(valueArr[j])
		})
	}
	return valueArr
}
